#include<iostream>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/wait.h>
using namespace std;

#define NUM 1024


void Writer(int wfd)
{
    string s="hello,I am child";
    // string buffer;
    char buffer[NUM];
    int count=0;
    while(true)
    {
        // sprintf(buffer,"%s",s.c_str());
        char ch='a';
        write(wfd,&ch,1);
        
    }
    // sleep(5);
}

void Reader(int rfd)
{
    char buffer[NUM];
    int count=0;
    while (true)
    {
        buffer[0]=0;
        int n=read(rfd,buffer,sizeof(buffer)-1);
        if(n<0)
        {
            perror("read");
            return;
        }
        else if(n==0)
        {
            printf("father read done\n");
            break;
        }
        else
        {
            buffer[n]=0;
            cout<<"father get a message: "<<buffer<<endl;
        }
        count++;
        if(count>5)
            break;
    }
    
    
}

int main()
{
    int fds[2]={0};
    int n=pipe(fds);    
    if(n<0)
    {
        perror("pipe");
        return 1;
    }
    pid_t id=fork();
    if(id<0)
    {
        perror("fork");
        return 1;
    }
    else if(id==0) //child
    {
        //关闭读
        close(fds[0]);
        Writer(fds[1]);
        close(fds[1]);
        exit(0);
    }
    else //father
    {
        // 关闭写
        close(fds[1]);
        Reader(fds[0]);
        close(fds[0]);  
        sleep(5);
        int status=0;
        pid_t rid=waitpid(id,&status,0);
        if(rid<0)
            return 3;
        
         cout << "wait child success: " << rid << " exit code: " << ((status>>8)&0xFF) << " exit signal: " << (status&0x7F) << endl;

        sleep(5);    
    }
    return 0;
}

















//int main()
//{
//  int fds[2];
//  char buf[128];
//  int len;
//  if(pipe(fds)==-1)
//  {
//    perror("pipe");
//    return 1;
//  }
// //read from stdin
// while(fgets(buf,128,stdin))
// {
//   len=strlen(buf);
//   //write in pipe
//   if(write(fds[1],buf,len)!=len)
//   {
//     perror("write");
//     break;
//   }
//   memset(buf,0,sizeof(buf));
//   //read from pipe
//   len=read(fds[0],buf,100);
//   if(len==-1)
//   {
//     perror("read from pipe ");
//     break;
//   }
//     //write to stdout
//     if(write(1,buf,len)!=len)
//     {
//       perror("write to stdout");
//       break;
//     }
//     
// }
//
//  return 0;
//}
